package model;

import java.util.ArrayList;

/**
 * La classe Collection stock toutes les cartes ainsi que leur type. Elle
 * listera toute les cartes du jeu et qui nous servira dans la gestion du deck
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public class Collection {

    CarteOffensive a1;
    CarteOffensive a2;
    CarteOffensive a3;
    CarteOffensive a4;
    CarteOffensive a5;
    CarteDefensive d1;
    CarteDefensive d2;
    CarteDefensive d3;
    CarteDefensive d4;
    CarteDefensive d5;
    int nbCarte;
    private ArrayList<Carte> listeCarte;

    /**
     * Constructeur de la classe, qui créée chaque carte puis les ajoutes dans
     * la liste des cartes.
     */
    public Collection() {
//    a1 = new CarteOffensive(2, "a1", null, 3, 1);
//    a2 = new CarteOffensive(1, "a2", null, 2, 1);
//    a3 = new CarteOffensive(5, "a3", null, 8, 5);
//    a4 = new CarteOffensive(1, "a4", null, 2, 2);
//    a5 = new CarteOffensive(3, "a5", null, 5, 3);
//    d1 = new CarteDefensive(4, "d1", null, 5, 4);
//    d2 = new CarteDefensive(1, "d2", null, 2, 2);
//    d3 = new CarteDefensive(2, "d3", null, 3, 1);
//    d4 = new CarteDefensive(7, "d4", null, 7, 5);
//    d5 = new CarteDefensive(1, "d5", null, 2, 1);

        a1 = new CarteOffensive(2, "DDoS", new Type("DDoS"), 3, 1);
        a2 = new CarteOffensive(1, "Phishing", new Type("Phishing"), 2, 1);
        a3 = new CarteOffensive(5, "Spam", new Type("Spam"), 8, 5);
        a4 = new CarteOffensive(1, "Spyware", new Type("Spyware"), 2, 2);
        a5 = new CarteOffensive(3, "Trojan", new Type("Trojan"), 5, 3);
        d1 = new CarteDefensive(4, "Firewall", new Type("Firewall"), 5, 4);
        d2 = new CarteDefensive(1, "Firewall", new Type("Firewall"), 2, 2);
        d3 = new CarteDefensive(2, "Cloud", new Type("Cloud"), 3, 1);
        d4 = new CarteDefensive(7, "Update", new Type("Update"), 7, 5);
        d5 = new CarteDefensive(1, "Update", new Type("Update"), 2, 1);
        nbCarte = 10;

        this.listeCarte = new ArrayList<>();
        this.listeCarte.add(a1);
        this.listeCarte.add(a2);
        this.listeCarte.add(a3);
        this.listeCarte.add(a4);
        this.listeCarte.add(a5);
        this.listeCarte.add(d1);
        this.listeCarte.add(d2);
        this.listeCarte.add(d3);
        this.listeCarte.add(d4);
        this.listeCarte.add(d5);
    }

    /**
     * Retourne la carte présente à l'indice i.
     *
     * @param indice de la carte désirée
     * @return la carte désirée
     */
    public Carte getCarte(int indice) {
        return this.listeCarte.get(indice);
    }

    /**
     * Retourne la liste des Cartes présentes dans la collection
     *
     * @return une liste de cartes
     */
    public ArrayList<Carte> getCartes() {
        return this.listeCarte;
    }

    /**
     * Permet de placer une Carte à un endroit particulier (indice) dans la
     * liste de cartes
     *
     * @param c carte à insérer dans la liste
     * @param indice emplacement de la carte insérée
     */
    public void setCarte(Carte c, int indice) {
        this.listeCarte.set(indice, c);
    }

    /**
     * Permet de générer le Deck pour chaque joueur. Le Deck sera consistué d'un
     * certain nombre de cartes défini en paramètre. Il sera composé de cartes
     * offensives et défensives.
     *
     * @param nb Nombre de cartes à placer dans le Deck
     * @return Le Deck généré
     */
    public Pile genererDeck(int nb) {
        Pile p = new Pile();
        for (int i = 0; i < nb; i++) {
            int choix = (int) (Math.random() * nbCarte);
            Carte c = this.listeCarte.get(choix);
            Carte newCarte;
            if (c.getAttitude().equals("offensive")) {
                CarteOffensive co = (CarteOffensive) c;
                newCarte = new CarteOffensive(co.getCout(), co.getNom(), co.getType(), co.getPointAttaque(), co.getVie());
            } else {
                CarteDefensive co = (CarteDefensive) c;
                newCarte = new CarteDefensive(co.getCout(), co.getNom(), co.getType(), co.getVie(), co.getPointContre());
            }
            p.empiler(newCarte);
        }
        return p;
    }
}
